

// ts的基本数据类型
let num=88;
let knum:number;
knum=100;

// 字符串类型定义
let bus="公交车"
let myname:string="你好"
let dd=`你好${bus}`
console.log(dd)

// 布尔类型
let flag:boolean=true;
let myflag=false;
console.log(flag)

// any 类型 (任意类型)
let sta:any;
let saf;//没有声明类型和赋值的 就是any类型
sta=12;
sta="123";
sta=true;


//数组类型
let arr:number[]=[1,2,3]
arr[3]=123
let list: Array<string> = ["1", "2", "3"];
let mylist :any[]=["13",123,true,[1,2,3]]//任意类型的数组
let kklist :Array<any>=[1,3,"435","345"]
let ff=[12,3,5,6,"123",true]
let myfflist:(string|number|boolean)[]=["1",2,true]


// 元组 Tuple
// 元组类型允许表示一个已知元素数量和类型的数组，各元素的类型不必相同
let myx: [string, boolean,number];
myx=["12",true,13]

let myTuple:[string,any,boolean,number,Array<number>]=["12",{name:1},true,123,[1,2,123]]
console.log(myTuple)
console.log(myTuple[0])

// enum(枚举)类型是对JavaScript标准数据类型的一个补充
enum Color {Red=3, Green, Blue}

console.log(Color.Red)//3
console.log(Color.Green)//4

let colorName: string = Color[4];
console.log(colorName)
enum c {name="张三", age=18, sex="男"}
console.log(c.name)

// ts的函数
let kfn=function(a,b){}
let kfn1=()=>{}
// ts的函数 参数不能直接省略
// ts 省略参数 加?  b?:string   可省略参数 设计到函数的后面的参数
let kfn2=(a:number=1,b?:string,c?:boolean)=>{
    console.log(a) 
    console.log(b)
    console.log(c)
} 
kfn2(12)
// 某种程度上来说，void类型像是与any类型相反，它表示没有任何类型
// void类型 接在函数名后  代表没有返回值
function myfn():void{
   let x=11;
   let y=22;
  //  return 88 规定了void 函数就不能有返回值、
}
// 默认函数返回undefined
console.log(myfn()) 
function adds():string{
  return "你好"
}


//Never never类型表示的是那些永不存在的值的类型
// never 类型 一般代表函数不能执行完成
// function hsay():never{
//   let x=11;
//   let y=22;
//   // 抛出错误
//   throw new Error("函数出错了");
//   let z=22;
// }
// console.log(hsay())

// undefined 和null 数据类型
let fh:undefined=undefined;
let kks:undefined;
let mysa:null=null;

// 类型断言
// let ksss:any="this is a string";
// console.log(ksss.substring(0,3))

let strnum:any="131677";
console.log(strnum.substring(0,3))
// 俩种类型断言
let mystr=  (<string>strnum).substring(0,3)
let ccc=(strnum as string).substring(0,3)
console.log(mystr)
console.log(ccc)

// object 类型
var obj={
    name:"1",
    age:2
}
console.log(obj.name)
// ts 对象 不能访问不存在的属性
// console.log(obj.sex)

// 描述对象的数据类型
let obj2:{
  name:string,
  age:number,
  sex:boolean
}={
  name:"zhang",
  age:18,
  sex:true
}
// ts 开发 推荐使用let 和const  
// let 和const 和var的区别
// let 和const 不能重复声明
// let 和const 产生块级作用域
// let 和const不存在变量提升
// let 和const 产生暂时性死区
// const 赋值常量   声明后无法从新赋值
let xx=11;
// let xx=22; //let 和const 不能重复声明
function sdd():void{
    // console.log(x)//x不存在变量提升
    // console.log(x)//使用let命令声明变量之前，该变量都是不可用的。这在语法上，称为“暂时性死区”
    console.log(yy)//undefined
    let x=88;
    var yy=99
}
if(true){
  let xx=11; //局部变量   产生块级作用域{}
}


